﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data;
using System.Data.SqlClient;


public enum ImportType
{
    /// <summary>
    /// Xóa dữ liệu cũ trước khi import 
    /// </summary>
    XoaDuLieuCu,
    /// <summary>
    /// Cập nhật dữ liệu cũ hoặc thêm dữ liệu mới khi import
    /// </summary>
    CapNhatDuLieuCu,
    /// <summary>
    /// Nếu dữ liệu mới đã có thì bỏ qua, nếu chưa có thì thêm vào
    /// </summary>
    BoQuaDuLieuCu
}

public abstract class IController
{
    protected string Eval(DataRow _Row, Dictionary<string, string> _ColumnMaps, Dictionary<string, string> _Params, string Col)
    {
        string ret = "";
        if (_ColumnMaps.ContainsKey(Col))
            ret = _Row[_ColumnMaps[Col]].ToString();
        if (_Params.ContainsKey(Col))
            ret = _Params[Col];
        if (ret != null)
            return ret.Trim();
        return "";
    }
    /// <summary>
    /// Kiểm tra xem bảng TableName có đúng với Controller tương ứng không
    /// </summary>
    /// <param name="TableName"></param>
    /// <returns></returns>
    public abstract bool CheckTableValid(string _TableName);
    /// <summary>
    /// Kiểm tra xem những cột chọn có đủ điều kiện để thao tác trên table tương ứng không
    /// ĐK: Phải có đủ các cột là khóa chính (cho phép ghi) và các cột không cho phép NULL. Đưa vào danh sách các cột
    /// </summary>
    /// <param name="KeyColumns"></param>
    /// <returns></returns>
    public abstract bool CheckColumnValid(List<string> _KeyColumns);
    /// <summary>
    /// Xử lý 1 dòng dữ liệu nhập, Trả về 0: nếu lỗi, trả về 1 nếu insert, 2 nếu update
    /// </summary>
    /// <param name="_Row"></param>
    /// <param name="_ColumnMaps"></param>
    /// <param name="_Params">Tham số truyền vào khi xử lý dòng</param>
    /// <param name="_ImpType"></param>
    /// <returns>Trả về 0: nếu lỗi, trả về 1 nếu insert, 2 nếu update, 3 nếu bỏ qua</returns>
    public abstract int Process(DataRow _Row, Dictionary<string, string> _ColumnMaps, Dictionary<string, string> _Params, ImportType _ImpType, System.Data.SqlClient.SqlConnection _Conn);
    /// <summary>
    /// Những việc cần làm trước khi xử lý
    /// </summary>
    /// <returns></returns>
    public virtual void BeforeProcess(SqlConnection _Connection, ImportType _ImpType) { }
}


